/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controllers;

import db.PersonDb;
import db.PersonInterface;
import java.util.ArrayList;
import models.Person;
import models.roles.*;

/**
 *
 * @author pelle
 */
public class PersonController {
    
    private PersonInterface personDb = new PersonDb();
    // Personen vi arbejder med lige nu
    private Person person = null;
    
    public PersonController() {
        person = new Person();
    }
    
    public PersonController(int personId) {
        if(personId > 0) {
            person = personDb.getPersonById(personId);
        }
    }
    
    public PersonController(Person person) {
        if(person != null) {
            int id = person.getId();
            person = personDb.getPersonById(id);
        }
    }
    
    // Returnere personobjektet
    public Person getPerson() {
        return person;
    }
    
    // Finder bynavnet ud fra postnummeret
    public String getCity(int zipcode) {
        return this.personDb.getCityFromZipcode(zipcode);
    }
    
    // Søger personer ud fra givet argumenter
    public ArrayList<Person> searchPersons(String name, String email, String phone, ArrayList<String> roles) {
        return personDb.searchPersons(name, email, phone, "", roles);
    }
    
    // Søger personer ud fra givet argumenter
    public ArrayList<Person> searchPersons(String name, String cpr) {
        return this.personDb.searchPersons(name, "", "", cpr, null);
    }
    
    // Tilføj en relateret person til personobjektet
    public boolean addRelatedPerson(Person person) {
        boolean success = false;
        
        if(person != null) {
            // Tilføjer den relaterede person til person-modelen
            success = this.person.addContact(person);
        }
        
        return success;
    }
    
    // Fjern en relateret person
    public boolean removeRelatedPerson(Person person) {
        boolean success = false;
        
        if(person != null) {
            success = this.person.removeContact(person);
        }
        
        return success;
    }
    
    // Metode til at konvertere Arraylist med Strenge over roller, til en arrayliste med abstrakte roller
    public ArrayList<AbstractRole> createRoles(ArrayList<String> roles, String sponsorName, String sponsorWebsite) {
        ArrayList<AbstractRole> personRoles = new ArrayList<AbstractRole>();
        
        // Foreach-loop
        for(String s : roles) {

            // Finder den type vi har gang i, og opretter en instans af den klasse og smider i array'et
            if(s.equals("member")) {
                personRoles.add(new Member());
            } else if(s.equals("manager")) {
                personRoles.add(new Manager());
            } else if(s.equals("trainer")) {
                personRoles.add(new Trainer());
            } else if(s.equals("inspector")) {
                personRoles.add(new Inspector());
            } else if(s.equals("sponsor")) {
                personRoles.add(new Sponsor(sponsorName, sponsorWebsite));
            }
        }
        
        return personRoles;
    }
    
    // Gem en person
    public int savePerson(String name, String address, int zipcode, String email, String phone, String cpr, String password, ArrayList<AbstractRole> personRoles) {
        // Sætter variablerne til person-modelen
        person.setName(name);
        person.setAddress(address);
        person.setZipcode(zipcode);
        person.setEmail(email);
        person.setPhone(phone);
        person.setCpr(cpr);
        person.setPersonRoles(personRoles);
        
        if(password.length() > 0) {
            person.setPassword(password);
        }
        
        return this.personDb.savePerson(this.person);
    }
    
    // Få medlems antal
    public int getMemberCount() {
        return this.personDb.getMemberCount();
    }
    
    // Få træner antal
    public int getTrainerCount() {
        return this.personDb.getTrainerCount();
    }
   
    public ArrayList<Person> getAllPersons()
    {
        return personDb.getAllPersons();
    }
    
     public Person getPersonById(int personId) {
        if(personId > 0) {
            person = personDb.getPersonById(personId);
        }
        return person;
    }
}
